package tv.athena.live.api.link_mic

import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.Observer
import android.view.ViewGroup
import com.yy.liveplatform.proto.nano.LpfLiveinterconnect
import tv.athena.live.api.IDataCallback
import tv.athena.live.base.arch.IComponentApi

/**
 *  create by chenhaofeng 2019/8/27
 */
interface ILinkMicApi : IComponentApi {

    /**
     *  获取连麦接口
     *  @param callBack 回调接口
     */
    fun getInterConnectUserList(
            callBack: IDataCallback<LpfLiveinterconnect.GetInterconnectUserListResp>?
    )

    /**
     *  发送邀请
     *  @param inviteUid  邀请的用户 uid
     *  @param inviteSid   邀请的用户 sid
     *  @param position 邀请用户应该在什么位置开播 , 默认是1，业务可根据自己的需要使用透传
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     *  @param extend 拓展字段 非必须
     */
    fun sendInviteReq(
            inviteUid: Long,
            inviteSid: Long,
            position: IntArray = intArrayOf(),
            businessType: Int,
            replaceUid: Long,
            extend: String?,
            callback: IDataCallback<LpfLiveinterconnect.InviteLiveInterconnectResp>?
    )

    /**
     *  发送邀请
     *  @param inviteUid  邀请的用户 uid
     *  @param inviteSid   邀请的用户 sid
     *  @param position 邀请用户应该在什么位置开播 , 默认是1，业务可根据自己的需要使用透传
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     *  @param mediaType 需要上麦的媒体类型 LpfMedia.MT_xx
     *  @param extend 拓展字段 非必须
     */
    fun sendInviteReq(
            inviteUid: Long,
            inviteSid: Long,
            position: IntArray = intArrayOf(),
            businessType: Int,
            mediaType: Int,
            replaceUid: Long,
            extend: String?,
            callback: IDataCallback<LpfLiveinterconnect.InviteLiveInterconnectResp>?
    )

    /**
     *  发送批量邀请
     *  @param inviteUidArray  邀请的用户数组 uid
     *  @param inviteSid   邀请的用户 sid
     *  @param startPosition 邀请用户应该在什么位置开播 , 默认是0，由服务器分配
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     *  @param extend 拓展字段 非必须
     */
    fun sendBatchInviteReq(
            inviteUidArray: LongArray,
            inviteSid: Long,
            startPosition: IntArray = intArrayOf(),
            extend: String? = "",
            businessType: Int,
            callBack: IDataCallback<LpfLiveinterconnect.BatchInviteLiveInterconnectResp>?
    )

    /**
     *  取消邀请
     *  @param inviteUid  邀请的用户 uid
     *  @param inviteSid   邀请的用户 sid`
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     */
    fun cancelInviteReq(
            inviteUid: Long,
            inviteSid: Long,
            businessType: Int,
            callBack: IDataCallback<LpfLiveinterconnect.InviteLiveInterconnectResp>?
    )

    /**
     *  被邀请方  接受 连麦邀请
     *  @param 响应对方的信息  B 邀请 A, A 回复B， 那么这里填写的时 B的信息，邀请方信息
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     */
    fun acceptInviteLiveInterconnectReq(
            replyInviteUserInfo: LpfLiveinterconnect.LiveInterconnectInfo,
            businessType: Int,
            position: IntArray = intArrayOf(),
            extend: String? = "",
            callBack: IDataCallback<LpfLiveinterconnect.ReplyInviteLiveInterconnectResp>? = null
    )

    /**
     *  被邀请方  接受 连麦邀请
     *  @param 响应对方的信息  B 邀请 A, A 回复B， 那么这里填写的时 B的信息，邀请方信息
     *  @param businessType 每个业务需要向  直播中台申请 businessType
     *  @param mediaType 连麦媒体类型，忽略或者把邀请接口带来的mediaType传进来即可
     */
    fun acceptInviteLiveInterconnectReq(
            replyInviteUserInfo: LpfLiveinterconnect.LiveInterconnectInfo,
            businessType: Int,
            position: IntArray = intArrayOf(),
            mediaType: Int,
            extend: String? = "",
            callBack: IDataCallback<LpfLiveinterconnect.ReplyInviteLiveInterconnectResp>? = null
    )

    /**
     * 被邀请方 拒绝 连麦邀请
     *
     *  @param isAutoReject 是否时超时处理，倒计时关闭后设置
     *  @param 响应对方的信息  B 邀请 A, A 回复B， 那么这里填写的时 B的信息，邀请方信息
     *  @param businessType 每个业务需要向  直播中台申请 businessType 目前 demo 秀场是 1
     */
    fun refuseInviteLiveInterconnectReq(
            replyInviteUserInfo: LpfLiveinterconnect.LiveInterconnectInfo,
            businessType: Int,
            position: IntArray = intArrayOf(),
            isAutoReject: Boolean = false,
            callBack: IDataCallback<LpfLiveinterconnect.ReplyInviteLiveInterconnectResp>?
    )

    /**
     * 断开连麦
     */
    fun closeLiveInterconnectReq(
            closeUid: Long,
            businessType: Int,
            callback: IDataCallback<LpfLiveinterconnect.CloseLiveInterconnectResp>?
    )

    /**
     * 断开连麦
     * @param extend 透传字段
     */
    fun closeLiveInterconnectReq(
            closeUid: Long,
            businessType: Int,
            extend: String? = null,
            callback: IDataCallback<LpfLiveinterconnect.CloseLiveInterconnectResp>? = null
    )

    /**
     * 添加视频播放（即订阅跨频道流信息）
     * @param sid 频道id
     * @param remoteUid 远端主播的uid
     * @param viewContainer 播放远端流的视频区域
     *
     */
    fun addLinkMicVideo(sid: String, remoteUid: String, viewContainer: ViewGroup, businessType: Int)

    fun switchVideoContainer(sid: String, remoteUid: String, viewContainer: ViewGroup, businessType: Int)

    fun removeVideo(sid: String, remoteUid: String, businessType: Int)

    /**
     * 观众申请连麦
     *
     */
    fun applyConnectReq(
            anchorUid: Long,
            businessType: Int,
            sid: Long,
            callback: IDataCallback<LpfLiveinterconnect.ApplyConnectResp>?
    )

    fun cancelApplyConnectReq(
            anchorUid: Long,
            businessType: Int,
            sid: Long,
            callback: IDataCallback<LpfLiveinterconnect.ApplyConnectResp>?
    )

    /**
     * 获取观众申请连麦列表
     */
    fun getApplyConnectListReq(
            anchorUid: Long,
            businessType: Int,
            sid: Long,
            callBack: IDataCallback<LpfLiveinterconnect.GetApplyConnectListResp>?
    )

    /**
     * 监听连麦申请的列表变化
     */
    fun observeApplyListUpdateEvent(
            owner: LifecycleOwner,
            observer: Observer<LpfLiveinterconnect.ApplyConnectUpdateUnicast>
    )

    /**
     * 用户调用此方法进行上麦操作
     * @param uid 上麦用户的Uid
     * @param isEnable  true 表示上麦操作， false 表示下麦
     * @param businessType  中台业务服务端定义，目前可看配置信息
     * @param callBack 上麦操作回调 通知，上麦操作有可能在获取token 的时候失败，这些通知都要回调出去，告诉
     * 调用方
     */
    fun takeMic(
            uid: String,
            isEnable: Boolean,
            businessType: Int,
            callBack: IDataCallback<Int>?
    )

    /**
     * 用户调用此方法进行上麦操作
     * @param uid 上麦用户的Uid
     * @param isEnable  true 表示上麦操作， false 表示下麦
     * @param businessType  中台业务服务端定义，目前可看配置信息
     * @param mediaType 要上麦的媒体类型
     * @param callBack 上麦操作回调 通知，上麦操作有可能在获取token 的时候失败，这些通知都要回调出去，告诉
     * 调用方
     */
    fun takeMic(
            uid: String,
            isEnable: Boolean,
            businessType: Int,
            mediaType: Int,
            callBack: IDataCallback<Int>?
    )

    /**
     * 此接口后续仅仅用来进行 锁住麦位操作
     * @param opUid 操作uid
     * @param opPosition 操作位置
     * @param opObject 操作对象
     * @param opType  1 是 open , 2是 close
     */
    fun opLivePositionReq(
            opUid: Long,
            opPosition: Int,
            opObject: Int,
            opType: Int,
            callBack: IDataCallback<LpfLiveinterconnect.OpLivePositionResp>?
    )

    /**
     * 连麦直连（省略握手）
     * @param businessType 连麦类型
     * @param mediaType 用户使用媒体类型 （LpfMedia.MT_AUD LpfMedia.MT_VIDEO LpfMedia.MT_NONE)
     * @param connectTuple 直连数组信息
     */
    fun directLiveInterconnectReq(
            businessType: Int,
            mediaType: Int,
            connectTuple: Array<LpfLiveinterconnect.ConnectTuple>,
            callBack: IDataCallback<LpfLiveinterconnect.DirectLiveInterconnectResp>?
    )

    /**
     * 查询被邀请信息
     * @param inviterUid 邀请人uid
     * @param liveBzType 查询某种开播类型的邀请
     */
    fun getInviteLiveInterconnectReq(
            inviterUid: Long,
            liveBzType: IntArray,
            callBack: IDataCallback<LpfLiveinterconnect.GetInviteLiveInterconnectResp>?
    )
}